package DA;

import BE.BEPosicionxRack;
import BE.BERack;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class DARack 
{
    //MANTENIMIENTO
    public ResultSet buscarRack(BERack rack, int tipoBusqueda)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT r.IDRACK, r.NOMBRE, z.NOMBRE, t.TIPO, r.NUMFILAS, "
                            + "r.NUMCOLUMNAS, r.ESTADO "
                     + "FROM RACK r, ZONAS z, TIPOPRODUCTO t "
                     + "WHERE r.IDZONAS = z.IDZONAS AND z.IDTIPOPRODUCTO = t.IDTIPOPRODUCTO "
                            + "AND r.ESTADO NOT LIKE '9' AND z.ESTADO = '1' AND r.NOMBRE LIKE '%" + rack.getNombre() + "%'";

        if (rack.getEstado() != 2)
            query += " AND r.ESTADO = '" + rack.getEstado() + "'";
        if (rack.getIdzona() > 0)
            query += " AND z.IDZONAS = " + rack.getIdzona();
        if (rack.getIdTipo() > 0)
            query += " AND z.IDTIPOPRODUCTO = " + rack.getIdTipo();

        if (tipoBusqueda == 0 ) //busqueda de todos los datos
            query = "SELECT r.IDRACK, r.NOMBRE, z.NOMBRE, t.TIPO, r.NUMFILAS, "
                         + "r.NUMCOLUMNAS, r.ESTADO "
                  + "FROM RACK r, ZONAS z, TIPOPRODUCTO t "
                  + "WHERE r.IDZONAS = z.IDZONAS AND z.IDTIPOPRODUCTO = t.IDTIPOPRODUCTO "
                        + "AND r.ESTADO NOT LIKE '9' AND z.ESTADO = '1'";
        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }
        bd.cierraConexion(con);
        return rs;
    }

    //AGREGAR
    public int agregarRack (BERack rack, int posicionesY [], int tipo)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        PreparedStatement s = null;
        
        String query = "INSERT INTO RACK (IDPOSICION,IDZONAS,NOMBRE,NUMFILAS,"
                     + "NUMCOLUMNAS,ESTADO) VALUES ((SELECT IDPOSICION FROM "
                     + "POSICIONRACK WHERE X = " + rack.getPosicion().getFila() +
                       " AND Y = " + rack.getPosicion().getColumna() + ")," + rack.getIdzona() +
                       ",'" + rack.getNombre() + "'," + rack.getNumeroFilas() + "," +
                       rack.getNumeroColumnas() + ",'1');\n";

        for (int i=0;i<posicionesY.length;i++)
        {
            query += "UPDATE POSICIONRACK SET ESTADO = '1' WHERE X = " +
                      rack.getPosicion().getFila() + " AND Y = " +
                      posicionesY[i] + ";\n";
            query += "INSERT INTO RACKXPOSICIONRACK VALUES ((SELECT MAX (IDRACK) FROM RACK),(SELECT IDPOSICION FROM "
                     + "POSICIONRACK WHERE X = " + rack.getPosicion().getFila() +
                       " AND Y = " + posicionesY[i] + "),'1');\n";
        }

        if (tipo == 0) query += "UPDATE ZONAS SET CANTRACKS = (SELECT COUNT(IDRACK) " +
                                                              "FROM RACK " +
                                                              "WHERE IDZONAS = " + rack.getIdzona() +") " +
                                "WHERE IDZONAS = " + rack.getIdzona() + ";\n";

        try
        {
           con = bd.conectar();
            s = con.prepareStatement(query);
            s.executeUpdate();
            
            
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de insertar datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            
            bd.cierraConexion(con);
            return 1;
        }

        bd.cierraConexion(con);
        return 0;
    }
    
    public int agregarRackCargaMasiva (BERack rack, int posicionesY [])
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        PreparedStatement s = null;
        
        String query = "INSERT INTO RACK (IDRACK,IDPOSICION,IDZONAS,NOMBRE,NUMFILAS,"
                     + "NUMCOLUMNAS,ESTADO) VALUES ("+ rack.getIdRack() +",(SELECT IDPOSICION FROM "
                     + "POSICIONRACK WHERE X = " + rack.getPosicion().getFila() +
                       " AND Y = " + rack.getPosicion().getColumna() + ")," + rack.getIdzona() +
                       ",'" + rack.getNombre() + "'," + rack.getNumeroFilas() + "," +
                       rack.getNumeroColumnas() + ",'"+ rack.getEstado() +"');\n";

        for (int i=0;i<posicionesY.length;i++)
        {
            query += "UPDATE POSICIONRACK SET ESTADO = '1' WHERE X = " +
                      rack.getPosicion().getFila() + " AND Y = " +
                      posicionesY[i] + ";\n";
            query += "INSERT INTO RACKXPOSICIONRACK VALUES ("+ rack.getIdRack() +",(SELECT IDPOSICION FROM "
                     + "POSICIONRACK WHERE X = " + rack.getPosicion().getFila() +
                       " AND Y = " + posicionesY[i] + "),'1');\n";
        }
        
        try
        {
           con = bd.conectar();
            s = con.prepareStatement(query);
            s.executeUpdate();
            
            
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de insertar datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            
            bd.cierraConexion(con);
            return 1;
        }

        bd.cierraConexion(con);
        return 0;
    }

    public boolean existeNombre (String nombre)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT COUNT(IDRACK) AS CANTIDAD "
                     + "FROM RACK WHERE NOMBRE = '" + nombre + "'";

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            rs.next();
            if (rs.getInt("CANTIDAD") > 0)
                return true;
        } catch (Exception e) {
            bd.cierraConexion(con);
            return false;
        }

        bd.cierraConexion(con);
        return false;
    }

    //ELIMINAR
    public int[] getPosicionRack (int idRack)
    {
        int posicion[] = new int[100];
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT IDPOSICION FROM RACKXPOSICIONRACK  WHERE IDRACK = " + idRack;
        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            int i = 1;
            while (rs.next())
            {
                posicion[i] = rs.getInt("IDPOSICION");
                i ++;
            }
            posicion[0] = i;

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }
        bd.cierraConexion(con);


        return posicion;
    }

    //ELIMINAR
    public int eliminarRack (int idRack, int tipo)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        int posicion[] = this.getPosicionRack(idRack);
        String query = "";
        
        query += "UPDATE RACK SET ESTADO = '0' WHERE IDRACK = " + idRack + ";\n";
        if (tipo == 1) query = "UPDATE RACK SET ESTADO = '1' WHERE IDRACK = " + idRack + ";\n";
        
        query += "UPDATE RACKXPOSICIONRACK SET ESTADO = '0' WHERE IDRACK = " + idRack + ";\n";

        for (int i=0;i<posicion[0];i++)
        {
            int pos = posicion[i];
            query += "UPDATE POSICIONRACK SET ESTADO = '0' WHERE IDPOSICION = " + pos + ";\n";
        }
        try
        {
            con = bd.conectar();
            s = con.createStatement();
            s.executeUpdate(query);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de borrar datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 1;
        }
        bd.cierraConexion(con);
        return 0;
    }

    public BERack getProdbyId(int idRack)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;

        BERack rack = null;
        String query = "SELECT r.IDRACK, r.NOMBRE, r.IDZONAS, r.NUMFILAS, r.NUMCOLUMNAS, "
                            + "r.ESTADO, p.IDPOSICION, p.X, p.Y "
                     + "FROM RACK r, ZONAS z, POSICIONRACK p "
                     + "WHERE r.IDZONAS = z.IDZONAS AND r.IDPOSICION = p.IDPOSICION AND r.IDRACK = " + idRack;
        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            rs.next();
            rack = new BERack();
            rack.setIdRack(rs.getInt("IDRACK"));
            rack.setNombre(rs.getString("NOMBRE"));
            rack.setIdzona(rs.getInt("IDZONAS"));
            rack.setNumeroFilas(rs.getInt("NUMFILAS"));
            rack.setNumeroColumnas(rs.getInt("NUMCOLUMNAS"));
            rack.getPosicion().setIdPosicion(rs.getInt("IDPOSICION"));
            rack.getPosicion().setFila(rs.getInt("X"));
            rack.getPosicion().setColumna(rs.getInt("Y"));
            rack.setEstado(rs.getInt("ESTADO"));
        }
        catch (Exception e)
        {
          JOptionPane.showMessageDialog(null,"Error al obtener productos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return rack;
    }

    //MODIFICAR
    public int modificaRack(BERack beRack) 
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        String query = "UPDATE RACK SET IDZONAS = '" + beRack.getIdzona() +
                       "', IDPOSICION = (SELECT IDPOSICION FROM POSICIONRACK WHERE X = "+ beRack.getPosicion().getFila() + " AND Y = " + beRack.getPosicion().getColumna() +") WHERE " + "IDRACK = " + beRack.getIdRack() + ";\n";
        
        int posicionesY[] = new int[beRack.getNumeroColumnas()];
        for (int i=0;i<posicionesY.length;i++)
            posicionesY[i] = beRack.getPosicion().getColumna() + i;
        
        for (int i=0;i<posicionesY.length;i++)
        {
            query += "UPDATE POSICIONRACK SET ESTADO = '1' WHERE X = " +
                      beRack.getPosicion().getFila() + " AND Y = " +
                      posicionesY[i] + ";\n";
        }

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            s.executeUpdate(query);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problemas al momento de actualizar datos",
                                          "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return 1;
        }

        bd.cierraConexion(con);
        return 0;
    }
    
    public boolean cabeRack (int x, int y)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT COUNT(IDPOSICION) AS CANTIDAD "
                     + "FROM POSICIONRACK WHERE ESTADO = '0' AND X = " + x + " AND "
                     + "Y = " + y;
        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            rs.next();
            if (rs.getInt("CANTIDAD") > 0)
                return true;
        } catch (Exception e) {
            bd.cierraConexion(con);
            return false;
        }

        bd.cierraConexion(con);
        return false;
    }  
    
    public void agregarPosicionRack(int idRack, int idZona, int fila, int columna)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;
        int idUsuario=-1;
        
        try
        {
            //guardo los datos del perfil

            con = bd.conectar();
            //JOptionPane.showMessageDialog(null,"Hola mundo","Error",JOptionPane.ERROR_MESSAGE);
            String query = "INSERT INTO posicionxrack( idrack,idzona, fila, columna, estado) VALUES (?, ?, ?, ?, ?)";

            PreparedStatement p=con.prepareStatement(query);
            p.setInt(1, idRack);
            p.setInt(2, idZona);
            p.setInt(3, fila);
            p.setInt(4, columna);
            p.setInt(5, 0);
            
            
            p.execute();
            
            



        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al ingresar la posición del rack"+e.toString(),"Registro de Usuarios",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            
        }
        bd.cierraConexion(con);
        
        //JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos","Registro de Usuarios",JOptionPane.INFORMATION_MESSAGE);
        
    }

    public int obtenerIdMaximo() {
        
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;
        int idUsuario=-1;
        
        try
        {
            //guardo los datos del perfil

            con = bd.conectar();
            //JOptionPane.showMessageDialog(null,"Hola mundo","Error",JOptionPane.ERROR_MESSAGE);
            String query = "Select MAX(idrack) FROM rack";

            PreparedStatement p=con.prepareStatement(query);
                    
            rs=p.executeQuery();
            
            
            while(rs.next())
            {
                idUsuario=rs.getInt(1);
            }
            

        } catch (Exception e) {
            //JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos"+e.toString(),"Registro de Usuarios",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return -1;
        }
        bd.cierraConexion(con);
        return idUsuario;
        
    }
    
    
    public ArrayList<BERack> obtenerRacks()
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;
        String query = "SELECT r.IDRACK, r.NOMBRE, r.IDZONAS, r.NUMFILAS, r.NUMCOLUMNAS, "
                            + "r.ESTADO, p.IDPOSICION, p.X, p.Y "
                     + "FROM RACK r, ZONAS z, POSICIONRACK p "
                     + "WHERE r.IDZONAS = z.IDZONAS AND r.IDPOSICION = p.IDPOSICION";
        
        ArrayList<BERack> lstRacks= new ArrayList<BERack>();
        try
        {
            con = bd.conectar();
            PreparedStatement p=con.prepareStatement(query);
            rs=p.executeQuery();
            
            while(rs.next())
            {
                BERack rack= new BERack();
               
                rack.setIdRack(rs.getInt("IDRACK"));
                rack.setNombre(rs.getString("NOMBRE"));
                rack.setIdzona(rs.getInt("IDZONAS"));
                rack.setNumeroFilas(rs.getInt("NUMFILAS"));
                rack.setNumeroColumnas(rs.getInt("NUMCOLUMNAS"));
                rack.getPosicion().setIdPosicion(rs.getInt("IDPOSICION"));
                rack.getPosicion().setFila(rs.getInt("X"));
                rack.getPosicion().setColumna(rs.getInt("Y"));
                rack.setEstado(rs.getInt("ESTADO"));
                
                lstRacks.add(rack);
                
            }
            
        } catch (Exception e) {
           // JOptionPane.showMessageDialog(null,"Problemas al momento de actualizar datos",
                                         //      "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return lstRacks;
    }

        public List<BEPosicionxRack> getPosicionesLibres(int idRack)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;
      List<BEPosicionxRack> lista = new ArrayList<BEPosicionxRack>();

        try
        {


                       //JOptionPane.showMessageDialog(null,"Hola mundo","Error",JOptionPane.ERROR_MESSAGE);
            String query = "select * from posicionxrack where idrack= "+ idRack+ " AND estado ="+0;
            con = bd.conectar();
            PreparedStatement p=con.prepareStatement(query);
            rs=p.executeQuery();

            while(rs.next())
            {
                BEPosicionxRack objpxr= new BEPosicionxRack() ;
                objpxr.setIdposicionxrack(rs.getInt("IDPOSICIONXRACK"));
                objpxr.setIdrack(rs.getInt("IDRACK"));
                objpxr.setFila(rs.getInt("fila"));
                objpxr.setColumna(rs.getInt("columna"));
                objpxr.setEstado(rs.getInt("estado"));

                lista.add(objpxr);

            }

            p.execute();





        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Problema al ingresar la posicion del rack"+e.toString(),"Registro de Usuarios",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }
        bd.cierraConexion(con);

        //JOptionPane.showMessageDialog(null,"Problema al consultar la base de datos","Registro de Usuarios",JOptionPane.INFORMATION_MESSAGE);
       return lista;
    }



     public boolean isOccupied (int x, int y)
    {
        DAConexion bd = new DAConexion();
        Connection con = null;
        ResultSet rs = null;
        Statement s = null;
        String query = "SELECT COUNT(IDPOSICION) AS CANTIDAD "
                     + "FROM POSICIONRACK WHERE ESTADO = '1' AND X = " + x + " AND Y = " + y;

        try
        {
            con = bd.conectar();
            s = con.createStatement();
            rs = s.executeQuery(query);

            rs.next();
            if (rs.getInt("CANTIDAD") > 0)
                return true;
        } catch (Exception e) {
            bd.cierraConexion(con);
            return false;
        }

        bd.cierraConexion(con);
        return false;
    }

    public ArrayList<BERack> obtenerRacks(int IdTipoProd) {
        DAConexion bd = new DAConexion();
        Connection con = null;
        Statement s = null;
        ResultSet rs = null;
        String query = "SELECT r.IDRACK, r.NOMBRE, r.IDZONAS, r.NUMFILAS, r.NUMCOLUMNAS, "
                            + "r.ESTADO, p.IDPOSICION, p.X, p.Y "
                     + "FROM RACK r, ZONAS z, POSICIONRACK p "
                     + "WHERE r.IDZONAS = z.IDZONAS AND r.IDPOSICION = p.IDPOSICION AND idtipoproducto = ?";
        
        ArrayList<BERack> lstRacks= new ArrayList<BERack>();
        try
        {
            con = bd.conectar();
            PreparedStatement p=con.prepareStatement(query);
            
            p.setInt(1, IdTipoProd);
            
            rs=p.executeQuery();
            
            while(rs.next())
            {
                BERack rack= new BERack();
               
                rack.setIdRack(rs.getInt("IDRACK"));
                rack.setNombre(rs.getString("NOMBRE"));
                rack.setIdzona(rs.getInt("IDZONAS"));
                rack.setNumeroFilas(rs.getInt("NUMFILAS"));
                rack.setNumeroColumnas(rs.getInt("NUMCOLUMNAS"));
                rack.getPosicion().setIdPosicion(rs.getInt("IDPOSICION"));
                rack.getPosicion().setFila(rs.getInt("X"));
                rack.getPosicion().setColumna(rs.getInt("Y"));
                rack.setEstado(rs.getInt("ESTADO"));
                
                lstRacks.add(rack);
                
            }
            
        } catch (Exception e) {
           // JOptionPane.showMessageDialog(null,"Problemas al momento de actualizar datos",
                                         //      "Error",JOptionPane.ERROR_MESSAGE);
            bd.cierraConexion(con);
            return null;
        }

        bd.cierraConexion(con);
        return lstRacks;
    }

}
